package com.tuyrt.firstcode.kotlin.coroutine

import kotlinx.coroutines.*


/**
 * Created by tuyrt7 on 2021/4/12.
 * 协程
 */

fun main() {
//    GlobalScope.launch {
//        println("codes run in coroutine scope")
//        delay(1500)
//        println("codes run in coroutine scope Finish")
//    }

//    runBlocking {
//        println("codes run in coroutine scope")
//        delay(1500)
//        println("codes run in coroutine scope Finish")
//    }

    runBlocking {
        coroutineScope {
            launch {
                for (i in 1..10) {
                    println(i)
                    delay(100)
                }
            }
        }
        println("coroutineScope end")
    }

    println("sleep start")
    Thread.sleep(1000)
    println("sleep end")
}

/**
总结：
1、 GlobalScope.launch 顶层协程，当应用程序执行结束时，也一起结束
2、 runBlocking 创建一个协程作用域，协程作用域内的所有代码和子协程没有全部执行完就一直阻塞当前 `线程`
3、 launch 只在协程作用域中使用
3、 coroutineScope 继承外协程的作用域并创建一个子作用域，和 runBlocking 一样，协程作用域内的所有代码和子协程没有全部执行完就一直阻塞当前 `协程`
 */


suspend fun printDot() = coroutineScope {
    launch {
        for (i in 1..10) {
            println(".")
            delay(100)
        }
    }
}

/**
 *  协程常用使用方法
 */
fun simpleCoroutine() {
    val job = Job()
    val scope = CoroutineScope(job)
    scope.launch {
        //执行逻辑
    }

    //取消
    job.cancel()
}